package com.example.demo.Utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.impl.ClaimsHolder;

import io.jsonwebtoken.*;
import com.auth0.jwt.interfaces.Claim;
import io.jsonwebtoken.impl.crypto.MacProvider;
import org.springframework.http.HttpRequest;

import javax.crypto.spec.SecretKeySpec;
import javax.servlet.http.HttpServletRequest;
import java.security.Key;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by hasee
 * on 2019/10/9 14:22
 */
public class CreateJWT {
    /**
     * 提醒自己一下
     * 当前项目的token还需改进一下逻辑
     * 1.每次手动登录需要用户提供账号和密码，生成token，返还给前端，放置在cookie
     * 2.在token的时限内，登录、访问权限内的内容
     * a.不需要再次签发token----------b.需要刷新token，再次签发
     * 验证->返回验证信息---------------验证->根据用户名查询密码->再次生成token->返回新token
     * **/

    /**
     * 更改一下
     * 两者可兼得
     * 后端提供登录时签发token的api，同时也提供refresh_token签证的api
     * token的时限短（分钟、小时）  refresh_token的时限长（天）
     * 由前端判断token是否失效，失效则用refresh_token去访问refresh_token签证的api，得到一个新的token
     * **/

    Key key = new SecretKeySpec("gi112233".getBytes(),
            SignatureAlgorithm.HS512.getJcaName());

    String secret = Algorithm.HMAC256("gi112233").toString();

    public String createToken(String userAccout,String userPassword,String role){
        String token="";
        String date="";
        SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        date=dateFormat.format(System.currentTimeMillis());
//        token= JWT.create()
//                //声明用户账号
//                .withClaim("useraccount",userAccout)
//                //声明创建时间
//                .withClaim("generatetime",System.currentTimeMillis())
//                //声明存在时间
//                .withClaim("exptime",1000*1*60*60)
//                //使用HMAC256的签名算法，以userPassword为密钥
//                .sign(Algorithm.HMAC256("gi112233"));
//        JWT.decode()
        token = Jwts.builder().setSubject(userAccout).claim("userPassword",userPassword)
                .claim("role",role)
                .signWith(SignatureAlgorithm.HS512,key).compact();
        System.out.println("token加密的时间为："+System.currentTimeMillis()+"___"+date);
        System.out.println("token密钥加密为："+token);


        return token;
    }

    public Claims analysisToken(HttpServletRequest request,String userAccount){
        ClaimsHolder claimsHolder;
        String user;
        Claims claims = null;
        String tokenBody;
        // String token;
        String oldToken;
        String newToken;
        //来自Authorization
        //token = request.getHeader("Authorization");
        oldToken = request.getHeader("Bearer");//来自Header中的Bearer
        System.out.println("在token工具类中打印："+request.getHeader("Authorization")+"\t"+oldToken);
        try {
//        System.out.println("replace的token："+token.replace(token,createToken(userAccount,"")));
            user = Jwts.parser()
                    .setSigningKey(key)
                    .parseClaimsJws(oldToken)
                    .getBody()
                    .getSubject();
            System.out.println("用户是"+user);
            claims = Jwts.parser()
                    .setSigningKey(key)
                    .parseClaimsJws(oldToken)
                    .getBody();
            tokenBody = claims.toString();
            System.out.println("token内容："+tokenBody);
            System.out.println("分别单独取出claims中的内容-用户名："+claims.getSubject()+"----密码"+
                    claims.get("userPassword")+"----角色"+claims.get("role"));
        }catch (Exception e){
            System.out.println("analysisToken中出现异常");
            user = null;
        }

        /**
         * 重新放发token
         * **/
//        newToken = createToken(userAccount,null);
        return claims;
    }
}
